package me.lensfrex.vegetables.resopnse;

import me.lensfrex.vegetables.data.Vegetable;
import me.lensfrex.vegetables.exceptions.IllegalPageParamException;
import me.lensfrex.vegetables.exceptions.RequestPageTooLargeException;
import me.lensfrex.vegetables.exceptions.SourceDataWornException;

import java.util.LinkedList;
import java.util.List;

/**
 * 请求处理工具
 * 由于功能较为简单，目前仅有获取分页数据的功能
 */
public class ResponseTool {
    /**
     * 根据给定的页索引以及页大小，对全部蔬菜数据进行分页并返回分页后的List。
     *
     * @param pageNum          页码（从1开始）
     * @param pageSize         页大小
     * @param allVegetableList 全体的待分页的蔬菜数据
     * @return LinkedList<Vegetable> 分页后的蔬菜数据。
     * @throws RequestPageTooLargeException 如果请求的页码已经超过了最大页数
     * @throws IllegalPageParamException    如果分页请求的参数不对
     */
    public List<Vegetable> getListPage(int pageNum, int pageSize, List<Vegetable> allVegetableList)
            throws RequestPageTooLargeException, IllegalPageParamException, SourceDataWornException {

        // 请求的分页大小或页码非法
        if (pageNum <= 0 || pageSize <= 0) {
            throw new IllegalPageParamException(
                    String.format("分页请求的参数不对：pageNum: %d, pageSize: %d", pageNum, pageSize));
        }

        int resultSize = allVegetableList.size();

        // 判断上一页的记录是不是已经超过最后一条记录，防止页码超过最大值
        if ((pageNum - 1) * pageSize >= resultSize) {
            if (allVegetableList.isEmpty()) {
                throw new SourceDataWornException("源数据为空");
            }
            throw new RequestPageTooLargeException("请求页码：" + pageNum);
        }

        LinkedList<Vegetable> pagedVegetableList = new LinkedList<>();
        for (int i = (pageNum - 1) * pageSize; (i < pageNum * pageSize && i < resultSize); i++) {
            pagedVegetableList.add(allVegetableList.get(i));
        }

        return pagedVegetableList;
    }

    /**
     * 根据数据字符串解析并获取蔬菜数据
     *
     * @param vegetableStrings 蔬菜数据源字符串列表，每条字符串信息格式应为
     *                         "蔬菜名 最低价 平均价 最高价 信息日期"
     *                         其中信息日期格式应为 "yyyy-mm-dd hh:mm:ss"
     * @return LinkedList<Vegetable> 解析后的蔬菜信息列表
     */
    public LinkedList<Vegetable> getAllVegetables(LinkedList<String> vegetableStrings) {
        LinkedList<Vegetable> vegetables = new LinkedList<>();
        for (String vegetableString : vegetableStrings) {
            try {
                vegetables.add(parseVegetableInfo(vegetableString));
            } catch (SourceDataWornException e) {
                e.printStackTrace();
            }
        }
        // 能成功读到多少就返回多少
        return vegetables;
    }

    /**
     * 解析Vegetable的信息字符串，并返回相应的蔬菜信息数据
     *
     * @param vegetableString 蔬菜信息字符串，
     *                        格式应为 "蔬菜名 最低价 平均价 最高价 信息日期"
     *                        其中信息日期格式应为 "yyyy-mm-dd hh:mm:ss"
     * @return 蔬菜信息数据类
     */
    private Vegetable parseVegetableInfo(String vegetableString) throws SourceDataWornException {
        Vegetable vegetable = new Vegetable();
        try {
            String[] spilt = vegetableString.split(" ");

            vegetable.setName(spilt[0]);
            vegetable.setPrice(Double.parseDouble(spilt[1]), Vegetable.PRICE_MIN);
            vegetable.setPrice(Double.parseDouble(spilt[2]), Vegetable.PRICE_AVG);
            vegetable.setPrice(Double.parseDouble(spilt[3]), Vegetable.PRICE_MAX);
            vegetable.setPriceDate(spilt[4] + ' ' + spilt[5]);

        } catch (Exception e) {
            throw new SourceDataWornException("解析源数据时发生错误：" + e.getMessage()
                    + "\n请检查源数据格式是否符合“蔬菜名 最低价(double) 平均价(double) 最高价(double) 信息日期”"
                    + "其中信息日期格式应为 \"yyyy-mm-dd hh:mm:ss\""
                    + "当前输入为：" + vegetableString);
        }

        return vegetable;
    }
}
